import { ElMessage } from 'element-plus'

interface Zm {
  version: string;
  env: string;
  info(message: string): void;
  success(message: string): void;
  warning(message: string): void;
  error(message: string): void;
  openLogin(): void;

  // 缓存相关方法
  setCache<T>(key: string, value: T, expire?: number): void;
  getCache<T>(key: string): T | null;
  removeCache(key: string): void;
  clearCache(): void;

  // 非空检查方法（泛型支持）
  isNotNon<T>(value: T | null | undefined): value is T;
}

const zm: Zm = {
  version: "1.0",
  env: "dev",
  info: (message: string): void => {
    ElMessage({ message });
  },
  success: (message: string): void => {
    ElMessage({ message, type: 'success' });
  },
  warning: (message: string): void => {
    ElMessage({ message, type: 'warning' });
  },
  error: (message: string): void => {
    ElMessage.error(message);
  },
  openLogin() {
    alert("打开登录页~");
  },

  // ===== 缓存方法实现 =====

  /**
   * 设置缓存数据（支持过期时间）
   * @param key 键
   * @param value 值
   * @param expire 过期时间（单位：秒）
   */
  setCache<T>(key: string, value: T, expire?: number): void {
    const data = {
      value,
      expire: expire ? Date.now() + expire * 1000 : null
    };
    localStorage.setItem(key, JSON.stringify(data));
  },

  /**
   * 获取缓存数据（自动判断是否过期）
   * @param key 键
   * @returns 解析后的值 或 null
   */
  getCache<T>(key: string): T | null {
    const item = localStorage.getItem(key);
    if (!item) return null;
  
    try {
      const data = JSON.parse(item);
      
      // 如果没有过期时间，直接返回数据
      if (data.expire === null || Date.now() <= data.expire) {
        return data.value as T;
      } else {
        this.removeCache(key);
        return null;
      }
    } catch {
      return item as unknown as T;
    }
  },

  /**
   * 删除指定缓存
   * @param key 键
   */
  removeCache(key: string): void {
    localStorage.removeItem(key);
  },

  /**
   * 清空所有缓存
   */
  clearCache(): void {
    localStorage.clear();
  },

  /**
   * 类型守卫函数：判断 value 是否为非空，并且是某个类型的对象
   */
  isNotNon<T>(value: T | null | undefined): value is T {
    if (value === null || value === undefined) return false;
    if (typeof value === 'string' && value.trim() === '') return false;
    if (Array.isArray(value) && value.length === 0) return false;
    if (typeof value === 'object' && Object.keys(value).length === 0) return false;
    return true;
  }
};

export default zm;